#include "Function.h"



/*======================================================================================
函数名：Sleep_Init
功  能：休眠初始化
输  入：无
输  出：无
====================================================================================*/
//void Sleep_Init(void)
//{
//	SLPTIM_CLR = 0x00;    // 清除看门狗定时器，写任何值清除看门狗
//	SLPTIM_SR  = 0x00;    // 清除睡眠定时器状态
//	SLPTIM_CR  = 0x87;    //使能睡眠定时器中断，关闭看门狗，使能睡眠定时器，睡眠定时器溢出值2s
//												//bit2:0 睡眠定时器溢出时间：
//																//000 4ms
//																//001 8ms
//																//010 16ms
//																//011 32ms
//																//100 256ms
//																//101 512ms
//																//110 1024ms
//																//111 2048ms
//	SLPTIM_PRDRH = 0x00;  //睡眠定时器溢出值为固定值
//}



/******************************************************************************************************
*  功     能：睡眠程序
*  入口参数: 无
*  出口参数：无
*  日     期：2022.8.17
*  作     者：行简
******************************************************************************************************/
void sleep_ctr(void)
{
  static uint8_t u8i=0,u8x=0;
  uint8_t temp;

  switch(StructRadio.u8status)
  {
  #if 1
    case SLEEP_TIM:
    u8i=0;	
	if(P_5V) 
	u8x=0;					 							
	if( (P_KEY_POWER==0) && (P2_PU&(1<<3))) 
	u8x=0;
	if( (P_KEY_CHAN_DEC==0) && (P2_PU&(1<<5))) 
	u8x=0;
 	if(StructRadio.disStruct.enumDisTimeStatus!=SHOW_CLOCK)  //调整时间退出休眠
	u8x=0;
    u8x++;
    if(u8x<19)
    return;
    else
    u8x=0;
	SCL_L;
	P0_PU = 0x00;
	SDA_L;
	P2_PU_PD((1<<5)|(1<<3),1);
	//P2_PU_PD((1<<3),1);	
    P2_IE	 =  (1<<5)|(1<<3);    //�򿪶˿��ж�
	P3_IE    =  (1<<0);
    P2_IC0 =  0x00;  //上升中断
    P2_IC1 =  0x00;
    P3_IC0 =  0x00;  //上升中断
    P3_IC1 =  0x00;
    IE_EA=1;
    P0_FLAG = 0xFF;              //清除GPIO0的中断
    P1_FLAG = 0xFF;              //清除GPIO1的中断
    P2_FLAG = 0xFF;              //清除GPIO2的中断
    P3_FLAG = 0xFF;              //清除GPIO3的中断
    temp = P0_DR;                //进入休眠前读一下IO状态
    temp = P1_DR;                //进入休眠前读一下IO状态
    temp = P2_DR;                //进入休眠前读一下IO状态
    temp = P3_DR;                //进入休眠前读一下IO状态
	//SLPTIM_CLR = 0x00;  
    //SLPTIM_CR  = 0x96;//关闭看门狗
	ADC_CR0=0x00;
	TIM0_CR=0;
    TIM0_IE=0;
	//SLPTIM_CLR = 0x00;    // 清除看门狗定时器，写任何值清除看门狗
	//SLPTIM_SR  = 0x00;    // 清除睡眠定时器状态
	//SLPTIM_CR  = 0x86;    //使能睡眠定时器中断，关闭看门狗，使能睡眠定时器，睡眠定时器溢出值2s
	DISABLE_FM_POWER;
	do
	{
      SCR_SLEEP = 0x03;  //使能深度睡眠模式

      dis_ctr();
	  san_dispaly();     //睡眠定时器唤醒之后更新显示
 	}while((P_5V==0)&&(P_KEY_POWER)&&(P_KEY_CHAN_DEC));
	SCR_SLEEP = 0x00;  //��������ģʽ
	//SLPTIM_CLR = 0x00;  
    //SLPTIM_CR  = 0xB6;//�򿪿��Ź�
	//ENABLE_FM_POWER;
    P3_IE	 =  0x00;
    P2_IE	 =  0x00;
    P1_IE	 =  0x00;
    P0_IE	 =  0x00;
	SCL_H;
	P0_PU = 0x20;
	SDA_H;
	ADC_Init();
    for(u8i=0;u8i<60;u8i++)
    {		
	    scan_switch();		  
        Get_ADC_Data(&structBattery);
        DelayMs(1);
    }
	Timer0_Init();
	u8i=0;
	u8x=0;
	break;
  #endif

    case SLEEP:
	u8x=0;
	if(P_5V) 
	u8i=0;
	if( (P_KEY_POWER==0) && (P2_PU&(1<<3)) ) 
	u8i=0;
    u8i++;
    if(u8i<19)
    return;
    else
    u8i=0;
	SCL_L;
	P0_PU = 0x00;
	SDA_L;
    P2_PU_PD((1<<3),1);
    P2_IE	 =  (1<<3);    //�򿪶˿��ж�
	P3_IE    =  (1<<0);
    P2_IC0 =  0x00;    //上升沿中断
    P2_IC1 =  0x00;
    P3_IC0 =  0x00;    //上升沿中断
    P3_IC1 =  0x00;
    IE_EA=1;
    P0_FLAG = 0xFF;              //清除GPIO0的中断
    P1_FLAG = 0xFF;              //清除GPIO1的中断
    P2_FLAG = 0xFF;              //清除GPIO2的中断
    P3_FLAG = 0xFF;              //清除GPIO3的中断
    temp = P0_DR;                //进入休眠前读一下IO状态
    temp = P1_DR;                //进入休眠前读一下IO状态
    temp = P2_DR;                //进入休眠前读一下IO状态
    temp = P3_DR;                //进入休眠前读一下IO状态
//	SLPTIM_CLR = 0x00;    // 清除看门狗定时器，写任何值清除看门狗
//	SLPTIM_SR  = 0x00;    // 清除睡眠定时器状态
//	SLPTIM_CR  = 0x87;    //使能睡眠定时器中断，关闭看门狗，使能睡眠定时器，睡眠定时器溢出值2s
//												//bit2:0 睡眠定时器溢出时间：
//																//000 4ms
//																//001 8ms
//																//010 16ms
//																//011 32ms
//																//100 256ms
//																//101 512ms
//																//110 1024ms
//																//111 2048ms
//	SLPTIM_PRDRH = 0x00;  //睡眠定时器溢出值为固定值
	ADC_CR0=0x00;
	TIM0_CR=0;
    TIM0_IE=0;
	DISP_CR=0x00;
	//SLPTIM_CLR = 0x00;  
    //SLPTIM_CR  = 0x96;//�رտ��Ź�
  //system_init();
    DISABLE_FM_POWER;
    do
    {
      SCR_SLEEP = 0x03;    //ʹ�����˯��ģʽ
    }
    while((P_KEY_POWER)&&(P_5V==0));
	SCR_SLEEP = 0x00;  //��������ģʽ
	DISP_CR=0x02;
	//ENABLE_FM_POWER;
	//SLPTIM_CLR = 0x00;  
    //SLPTIM_CR  = 0xB6;//�򿪿��Ź�
	P3_IE	 =  0x00;
    P2_IE	 =  0x00;
    P1_IE	 =  0x00;
    P0_IE	 =  0x00;
	SCL_H;
	P0_PU = 0x20;
	SDA_H;
	ADC_Init();
    for(u8i=0;u8i<60;u8i++)
    {	
	    scan_switch();			  
        Get_ADC_Data(&structBattery);
        DelayMs(1);
    }
	Timer0_Init();
	u8x=0;
    u8i=0;
	break;

	default:
	u8x=0;
    u8i=0;
	break;
  }
}




